package com.apexedu.portal.service.impl;

import com.apexedu.framework.dao.BaseDao;
import com.apexedu.framework.util.DBUtil;
import com.apexedu.framework.util.Pager;
import com.apexedu.identity.entity.TSysUser;
import com.apexedu.portal.constant.ActionConstant;
import com.apexedu.portal.entity.TLbxx;
import com.apexedu.portal.entity.TLbxxMx;
import com.apexedu.portal.entity.TMessage;
import com.apexedu.portal.entity.TUserMessagefactory;
import com.apexedu.portal.util.DBMUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.ModelMap;

import java.util.ArrayList;
import java.util.List;

/**
 * 网站管理
 *
 * @datetime 2015.07.22
 */
@Service("messageService")
public class MessageServiceImpl {

	private static final Log LOG = LogFactory.getLog(MessageServiceImpl.class);
	@Autowired
	BaseDao baseDao;

	/**
	 * 【方法名】：刷新流程信息（LiveBOS系统--->门户流程表）<br/>
	 * 【简介】：<br/>
	 * 1、将（指定用户、指定处理状态）的流程从各个业务系统中查询出来<br/>
	 * 2、将查询出的数据汇总<br/>
	 * 3、将门户的类别消息明细表中（指定用户、指定处理状态）的旧数据删除，并插入刚刚查出的汇总数据<br/>
	 * 【创建时间】：2016年9月7日 上午10:57:50<br/>
	 * 
	 * @param userId 待刷新流程的用户
	 * @param workflowTypeId 待刷新流程的状态值
	 */
	public void flushWorkflowFromLiveBOS2Portal(String userId, String workflowTypeId) {
		try {
			/*
			 * 查询类别信息明细汇总列表
			 */
			//类别信息明细汇总列表
			List<TLbxxMx> lbxxmxList = new ArrayList<TLbxxMx>();
			//查询类别信息列表
			List<TLbxx> lbxxList = DBUtil.queryAllBeanList("select * from t_lbxx where state=1 and upid='" + workflowTypeId + "' order by orderno", TLbxx.class);
			//迭代类别信息列表，从各个业务系统中查询出类别信息明细列表，并加入汇总列表中
			if (!lbxxList.isEmpty()) {
				for (TLbxx lbxx : lbxxList) {
					//数据库名称
					String dsNameTemp = lbxx.getDb();
					//执行的sql
					String sqlTemp = lbxx.getSql().replaceAll("\\{userid\\}", userId).replaceAll("\\{db\\}", dsNameTemp);
					//查询出当前类别下的信息明细列表
					List<TLbxxMx> lbxxmxListTemp = new DBMUtil(dsNameTemp).queryAllBeanList(sqlTemp, TLbxxMx.class);
					//将当前信息明细列表加入汇总列表中
					lbxxmxList.addAll(lbxxmxListTemp);
				}
			}

			/*
			 * 1、清除旧的无效数据
			 * 2、如果状态为“待办流程”的类表信息明细汇总列表不为空，则将其加入门户系统的相应表中
			 */
			/* 删除列表明细表中（指定用户、指定处理状态）的旧数据 */
			String delsql = "delete T_Lbxx_Mx where processtype=? and userid=?";
			DBUtil.executeSQL(delsql, workflowTypeId, userId);
			/* 插入新数据 */
			if (null != lbxxmxList && lbxxmxList.size() > 0 && workflowTypeId.equals(ActionConstant.Process_Charge)) {
				/* 将汇总信息明细列表中的数据插入信息明细表中 */
				String insertsql = "insert into T_Lbxx_Mx(wid,id,url,title,time,state,processtype,userid,db) select sys_guid(),?,?,?,?,?,?,?,? from dual";

				/* 循环执行数据查询，当列表很大时会非常耗时，需要改为批处理 */
				List<Object[]> paramsList = new ArrayList<Object[]>();
				Object[] params = null;
				for (int i = 0; i < lbxxmxList.size(); i++) {
					TLbxxMx tlbxxmx = lbxxmxList.get(i);
					//DBUtil.executeSQL(insertsql, tlbxxmx.getId(), tlbxxmx.getUrl(), tlbxxmx.getTitle(), tlbxxmx.getTime(), tlbxxmx.getState(), workflowTypeId, userId, tlbxxmx.getDb());

					params = new Object[8];
					params[0] = tlbxxmx.getId();
					params[1] = tlbxxmx.getUrl();
					params[2] = tlbxxmx.getTitle();
					params[3] = tlbxxmx.getTime();
					params[4] = tlbxxmx.getState();
					params[5] = workflowTypeId;
					params[6] = userId;
					params[7] = tlbxxmx.getDb();
					paramsList.add(params);
				}
				DBUtil.executeBatch(insertsql, paramsList);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 【方法名】：刷新门户流程类型的消息（门户流程表--->门户消息表）<br/>
	 * 【简介】：只处理了待办状态的流程<br/>
	 * 1、将消息表中（指定用户）的（状态为处理中：1）的数据处理状态更新为已中止：3<br/>
	 * 2、将类别信息明细表中(当前用户)（状态为待办流程）的记录插入消息表（忽略已经存在的）<br/>
	 * 3、对比消息表和类别信息明细表中(当前用户)的数据，将存在于类别信息明细表且状态为待办流程：3的类别消息明细对应的消息的处理状态设置为处理中：1<br/>
	 * 【创建时间】：2016年9月7日 上午11:04:41<br/>
	 * 
	 * @param userId 待刷新流程的用户
	 * @param workflowTypeId 待刷新流程的状态值
	 */
	public void flushMessageFromPortalWorkflow2PortalMessage(String userId, String workflowTypeId) {
		//将消息表中(当前用户)（处理状态为处理中：1）消息的处理状态设置为已中止：3
		String sqlUpdate = "update t_message tm set tm.clzt=3 where userid=? and tm.clzt=1";
		DBUtil.executeSQL(sqlUpdate, userId);

		//将类别信息明细表中(当前用户)（状态为待办流程）的记录插入消息表（忽略已经存在的）
		String sqlInsert = "  insert into t_message(wid,bt,nr,url,zt,userid,ly,type,broadcastusers,sj) " + "select sys_guid(),t.title,t.title,t.url,'unread',t.userid,t.db,'user','',sysdate  from t_lbxx_mx t " + "where 1=1 "
				+ " and t.url not in(select url from t_message m  where m.userid =?) "
				//+ " and not exists (select 1 from t_message m where m.url=t.url) "
				+ " and t.userid=? and t.processtype=?";
		DBUtil.executeSQL(sqlInsert, userId, userId, workflowTypeId);

		//对比消息表和类别信息明细表中(当前用户)的数据，将存在于类别信息明细表且状态为待办流程：3的类别消息明细对应的消息的处理状态设置为处理中：1
		String sqlUpdate2 = "update t_message tm set tm.clzt=1 where 1=1 and tm.url in (select url from t_lbxx_mx tmx where tmx.userid=? and tmx.processtype=?) and tm.userid=?";
		DBUtil.executeSQL(sqlUpdate2, userId, workflowTypeId, userId);
	}

	/**
	 * 获取未读信息数量
	 *
	 * @return
	 */
	public String unread(TSysUser user) {
		if (user == null)
			return "0";
		int count = DBUtil.count("SELECT count(*) FROM T_MESSAGE WHERE USERID=? AND ZT='unread'", user.getUserid());
		return String.valueOf(count);
	}

	/**
	 * 获取未读信息
	 *
	 * @return
	 */
	public String unreadlist(TSysUser user) {
		String sql_num = "";
		StringBuffer sb = new StringBuffer();
		sb.append("<ul>");
		if (user != null) {
			String sql = " select t.wid,t.messagename,(select code from t_db where wid=t.code) as code,t.querysql,t.applicablerole,t.shuom,t.state,t.accessurl " + " from T_USER_MESSAGEFACTORY t " + " where t.APPLICABLEROLE like '%" + user.getUsertype()
					+ "%' ";
			List<TUserMessagefactory> list = DBUtil.queryAllBeanList(sql, TUserMessagefactory.class);
			if (list != null && list.size() > 0) {
				for (int i = 0; i < list.size(); i++) {
					TUserMessagefactory tuserMessagefactory = list.get(i);
					sql_num = tuserMessagefactory.getQuerysql();
					DBMUtil dbmUtil = new DBMUtil(tuserMessagefactory.getCode());
					try {
						int count = dbmUtil.count("select count(*) from (" + sql_num.replaceAll("\\{userid\\}", user.getUserloginid()) + ")");
						if (count > 0) {
							sb.append("<li onclick=\"var url=encodeURIComponent('" + tuserMessagefactory.getAccessurl() + "');gotoHtml(url);\"><div class='txsw'>").append(tuserMessagefactory.getMessagename()).append(count).append("未读信息")
									.append("</div></li>");
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
		sb.append("</ul>");
		return sb.toString();
	}

	/**
	 * 加载信息
	 *
	 * @param user 当前登录用户
	 * @param model
	 */
	public void loadMessage(TSysUser user, Pager pager, ModelMap model) {
		String sqlCount = "select count(*) from t_message where userid=? and clzt=1 ";
		String sql = "select t.*,(select td.name from t_db td where td.code=t.ly) as lymc from t_message t where userid=? and clzt=1 order by clzt asc, zt desc,sj desc";
		long c = DBUtil.count(sqlCount, user.getUserloginid());
		pager.setTotalRows(c);
		List<TMessage> list = DBUtil.queryPageBeanList(pager, sql, TMessage.class, user.getUserloginid());
		model.put("messageList", list);
	}

	/**
	 * 信息详情页面
	 *
	 * @param user 当前登录用户
	 * @param messagewid 信息wid
	 * @param model
	 */
	public void loadDetail(TSysUser user, ModelMap model, String messagewid) {
		TMessage message = DBUtil.queryBean("SELECT * FROM T_MESSAGE WHERE USERID=? and WID=?", TMessage.class, user.getUserid(), messagewid);
		model.put("message", message);
		//标记为已读
		DBUtil.executeSQL("UPDATE T_MESSAGE SET zt='read' WHERE USERID=? AND WID=?", user.getUserid(), messagewid);
	}

}
